import { 
  DbManager, 
  Table, 
  TableId, 
  TableField, 
  TableIndex, 
  OneToMany, 
  ManyToOne 
} from '../src';

// 定义用户实体
@Table({ name: 'users' })
@TableIndex({ name: 'idx_users_email', columns: ['email'], unique: true })
class User {
  @TableId()
  id!: number;
  
  @TableField({ notNull: true })
  username!: string;
  
  @TableField({ unique: true })
  email!: string;
  
  @TableField()
  age?: number;
  
  @TableField({ defaultValue: Date.now })
  createdAt!: number;
  
  @OneToMany(() => Post)
  posts?: Post[];
}

// 定义文章实体
@Table({ name: 'posts' })
class Post {
  @TableId()
  id!: number;
  
  @TableField({ notNull: true })
  title!: string;
  
  @TableField()
  content?: string;
  
  @TableField({ notNull: true })
  authorId!: number;
  
  @ManyToOne(() => User)
  author?: User;
  
  @TableField({ defaultValue: Date.now })
  createdAt!: number;
}

async function main() {
  // 创建数据库连接
  const db = DbManager.connect(':memory:'); // 使用内存数据库进行演示
  
  // 注册实体
  db.registerEntity(User);
  db.registerEntity(Post);
  
  // 同步表结构
  db.syncEntityMetadata(User);
  db.syncEntityMetadata(Post);
  
  console.log('数据库和表结构已初始化');
  
  // 插入一些用户数据
  await db.oper(User)
    .insert([
      { username: '张三', email: 'zhangsan@example.com', age: 28 },
      { username: '李四', email: 'lisi@example.com', age: 32 },
      { username: '王五', email: 'wangwu@example.com', age: 25 }
    ])
    .execute();
  
  console.log('用户数据已插入');
  
  // 查询所有用户
  const users = await db.oper(User)
    .select()
    .execute();
  
  console.log('所有用户:', users);
  
  // 插入一些文章
  await db.transaction(async (manager) => {
    // 获取第一个用户ID
    const user1 = await manager.oper(User)
      .select()
      .where('username', '=', '张三')
      .first();
    
    // 为用户添加文章
    if (user1) {
      await manager.oper(Post)
        .insert([
          { 
            title: '第一篇文章', 
            content: '这是张三的第一篇文章',
            authorId: user1.id
          },
          { 
            title: '第二篇文章', 
            content: '这是张三的第二篇文章',
            authorId: user1.id
          }
        ])
        .execute();
      
      console.log(`为用户 ${user1.username} 添加了文章`);
    }
  });
  
  // 查询用户及其文章
  const userWithPosts = await db.oper(User)
    .select('u.*', 'COUNT(p.id) as postCount')
    .as('u')
    .leftJoin('posts', 'p.authorId', '=', 'u.id')
    .where('u.id', '>', 0)
    .groupBy('u.id')
    .execute();
  
  console.log('用户及其文章数:', userWithPosts);
  
  // 更新用户信息
  await db.oper(User)
    .update({ age: 29 })
    .where('username', '=', '张三')
    .execute();
  
  console.log('用户信息已更新');
  
  // 查询更新后的用户
  const updatedUser = await db.oper(User)
    .select()
    .where('username', '=', '张三')
    .first();
  
  console.log('更新后的用户:', updatedUser);
}

// 运行示例
main().catch(error => {
  console.error('发生错误:', error);
}); 